home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d1 / free402.arc / FREE.ASM next >
Assembly Source File  |  1987-02-16  |  9KB  |  224 lines

  1. PAGE ,132
  2. TITLE Free Memory Query Program, Version 4.02, 16-Feb-1987
  3.  
  4. ;
  5. ; Written By Steven Georgiades
  6. ;
  7. ; Free Memory Query Program
  8. ;   Will respond with the amount of available memory in your system.  This 
  9. ;   includes standard memory as well as extended memory (AT's) and expanded
  10. ;   memory (Lotus/Intel/Microsoft).  
  11. ;
  12. ;       If you are using this program and find it of value, your
  13. ;       contribution in any amount ($5.00 suggested) will be greatly
  14. ;       appreciated.  Makes checks payable to Steven M. Georgiades.
  15. ;               Thank you.
  16. ;
  17. ;       If you have any questions or comments about this or any other
  18. ;       SMG program, call or write:
  19. ;
  20. ;               Steven M. Georgiades
  21. ;               SMG Software
  22. ;               701-H South Hayward Street
  23. ;               Anaheim, CA 92804
  24. ;
  25.  
  26. CODE      SEGMENT BYTE PUBLIC 'CODE'
  27.  
  28.           ASSUME  CS:CODE,DS:CODE
  29.  
  30.           ORG     100H
  31.  
  32. START:    JMP     FREE
  33.  
  34.           DB      13,"Free Memory Query Program, Version 4.02",13,10
  35.           DB      "SMG Software",13,10
  36.           DB      "(C) Copyright 1986,1987 Steven M. Georgiades",13,10,1AH
  37.  
  38. AVAILPAG  DW      ?
  39. AVAILPAR  DW      ?
  40. TOTALPAG  DW      ?
  41. TOTALPAR  DW      ?
  42.  
  43. EMM_NAME  DB      "EMMXXXX0"
  44. EMM_NLEN  EQU     $-OFFSET EMM_NAME
  45. ERRIMS    DB      "Expanded Memory Manager Error!",7,13,10,"$"
  46. PC100     DB      "100.0"
  47.  
  48. FREE:     INT     12H                           ; Get Total Standard Memory
  49.           MOV     DX,64                         ; Convert to Paragraphs
  50.           MUL     DX
  51.           MOV     TOTALPAR,AX                   ;   and Save
  52.           MOV     DX,16                         ; Convert to Bytes
  53.           MUL     DX
  54.           MOV     DI,OFFSET TOTAL[8]            ; Convert to Decimal-ASCII
  55.           CALL    DEC8OUT
  56.           CALL    STRIP0
  57.           MOV     AH,9                          ; Output to Screen
  58.           MOV     DX,OFFSET TOTAL
  59.           INT     21H
  60.           MOV     AX,CS                         ; Determine Available Memory
  61.           DEC     AX                            ;   from Mem Alloc Cntl Block
  62.           MOV     ES,AX
  63.           MOV     AX,ES:[3]
  64.           MOV     AVAILPAR,AX
  65.           MOV     BX,16
  66.           MUL     BX
  67.           MOV     CX,DX
  68.           MOV     BX,AX
  69.           MOV     DI,OFFSET AVAIL[8]            ; Convert to Decimal-ASCII
  70.           CALL    DEC8OUT
  71.           CALL    STRIP0
  72.           MOV     AX,AVAILPAR                   ; Calculate Percent Available
  73.           MOV     BX,100
  74.           MUL     BX
  75.           MOV     BX,TOTALPAR
  76.           DIV     BX
  77.           MOV     DI,OFFSET AVAIL[35]           ; Convert Percent to ASCII
  78.           CALL    DEC2OUT
  79.           CALL    STRIP0
  80.           MOV     AX,DX
  81.           MOV     BX,100
  82.           MUL     BX
  83.           MOV     BX,TOTALPAR
  84.           DIV     BX
  85.           MOV     DI,OFFSET AVAIL[38]
  86.           CALL    DEC2OUT
  87.           MOV     AH,9                          ; Output to Screen
  88.           MOV     DX,OFFSET AVAIL
  89.           INT     21H
  90.           MOV     AH,88H                        ; Check for Extended Memory
  91.           INT     15H
  92.           JC      CHK_IMS                       ; If None, Skip to IMS Memory
  93.           OR      AX,AX
  94.           JZ      CHK_IMS
  95.           MOV     BX,1024                       ; Convert Size (K) to Bytes
  96.           MUL     BX
  97.           MOV     DI,OFFSET ETOTAL[8]           ; Convert to Decimal-ASCII
  98.           CALL    DEC8OUT
  99.           CALL    STRIP0
  100.           MOV     AH,9                          ; Output to Screen
  101.           MOV     DX,OFFSET ETOTAL
  102.           INT     21H
  103. CHK_IMS:  PUSH    ES                            ; Check for IMS Expanded Memory
  104.           MOV     AX,3567H
  105.           INT     21H
  106.           MOV     DI,10
  107.           MOV     SI,OFFSET EMM_NAME
  108.           MOV     CX,EMM_NLEN
  109.           CLD
  110.           REPE    CMPSB
  111.           POP     ES
  112.           JNE     DONE                          ; If None, Skip
  113.           MOV     AH,42H                        ; Get IMS Memory Size (Pages)
  114.           INT     67H
  115.           OR      AH,AH                         ; If Error, Flag It
  116.           JNZ     IMSERR
  117.           MOV     TOTALPAG,DX                   ; Save Memory Size Parameters
  118.           MOV     AVAILPAG,BX
  119.           MOV     AX,16384                      ; Convert Pages to Bytes
  120.           MUL     DX
  121.           MOV     DI,OFFSET IMSTOTAL[8]         ; Convert to Decimal-ASCII
  122.           CALL    DEC8OUT
  123.           CALL    STRIP0
  124.           MOV     AH,9                          ; Output to Screen
  125.           MOV     DX,OFFSET IMSTOTAL
  126.           INT     21H
  127.           MOV     AX,16384                      ; Convert Available to Bytes
  128.           MUL     BX
  129.           MOV     DI,OFFSET IMSAVAIL[8]         ; Convert to Decimal-ASCII
  130.           CALL    DEC8OUT
  131.           CALL    STRIP0
  132.           MOV     AX,AVAILPAG                   ; Calculate Percent Available
  133.           CMP     AX,TOTALPAG
  134.           JNE     NOT_ALL
  135.           MOV     DI,OFFSET IMSAVAIL[49]
  136.           MOV     SI,OFFSET PC100
  137.           MOV     CX,5
  138.           REP     MOVSB
  139.           JMP     SHORT AVAILOUT
  140. NOT_ALL:  MOV     BX,100
  141.           MUL     BX
  142.           MOV     BX,TOTALPAG
  143.           DIV     BX
  144.           MOV     DI,OFFSET IMSAVAIL[51]        ; Convert Percent to ASCII
  145.           CALL    DEC2OUT
  146.           CALL    STRIP0
  147.           MOV     AX,DX
  148.           MOV     BX,100
  149.           MUL     BX
  150.           MOV     BX,TOTALPAG
  151.           DIV     BX
  152.           MOV     DI,OFFSET IMSAVAIL[54]
  153.           CALL    DEC2OUT
  154. AVAILOUT: MOV     AH,9                          ; Output to Screen
  155.           MOV     DX,OFFSET IMSAVAIL
  156.           INT     21H
  157. DONE:     MOV     AX,4C00H                      ; Exit to DOS
  158.           INT     21H
  159. IMSERR:   MOV     AH,9                          ; Output IMS Error Message
  160.           MOV     DX,OFFSET ERRIMS
  161.           INT     21H
  162.           MOV     AX,4C01H                      ; Exit to DOS (RetCode = 1)
  163.           INT     21H
  164.  
  165. STRIP0:   CMP     BYTE PTR [DI],'0'             ; If this char is not '0', Done
  166.           JNE     STRIP1
  167.           CMP     BYTE PTR [DI+1],'0'           ; If next byte in non-numeric,
  168.           JL      STRIP1                        ;   Done
  169.           CMP     BYTE PTR [DI+1],'9'
  170.           JG      STRIP1
  171.           MOV     BYTE PTR [DI],' '             ; Replace '0' with ' '
  172.           INC     DI                            ; Point to next character
  173.           JMP     SHORT STRIP0                  ; Repeat
  174. STRIP1:   RET                                   ; Done
  175.  
  176.  
  177. DEC2OUT:  PUSH    AX                            ; Save Registers
  178.           PUSH    BX
  179.           XOR     AH,AH                         ; Clear AH
  180.           MOV     BL,10                         ; AH=AX%10,AL=AX/10
  181.           DIV     BL
  182.           ADD     AX,'00'                       ; Convert to ASCII
  183.           SUB     DI,2
  184.           MOV     [DI],AX                       ; Store in String
  185.           POP     BX                            ; Restore Registers
  186.           POP     AX
  187.           RET                                   ; Done
  188.  
  189. DEC4OUT:  PUSH    AX                            ; Save Registers
  190.           PUSH    BX
  191.           MOV     BL,100                        ; AH=AX%100,AL=AX/100
  192.           DIV     BL
  193.           XCHG    AH,AL                         ; Convert 2 LSD's
  194.           CALL    DEC2OUT
  195.           XCHG    AH,AL                         ; Convert 2 MSD's
  196.           CALL    DEC2OUT
  197.           POP     BX                            ; Restore Registers
  198.           POP     AX
  199.           RET                                   ; Done
  200.  
  201. DEC8OUT:  PUSH    AX                            ; Save Registers
  202.           PUSH    BX
  203.           PUSH    DX
  204.           MOV     BX,10000                      ; DX=DX:AX%10000,AX=DX:AX/10000
  205.           DIV     BX
  206.           XCHG    DX,AX                         ; Convert 4 LSD's
  207.           CALL    DEC4OUT
  208.           XCHG    DX,AX                         ; Convert 4 MSD's
  209.           CALL    DEC4OUT
  210.           POP     DX                            ; Restore Registers
  211.           POP     BX
  212.           POP     AX
  213.           RET                                   ; Done
  214.  
  215. TOTAL     DB      "       0 Bytes Total Memory",13,10,"$"
  216. AVAIL     DB      "       0 Bytes Available Memory ( 0.00%)",13,10,"$"
  217. ETOTAL    DB      "       0 Bytes of Extended Memory Total",13,10,"$"
  218. IMSTOTAL  DB      "       0 Bytes of LIM Expanded Memory Total",13,10,"$"
  219. IMSAVAIL  DB      "       0 Bytes of LIM Expanded Memory Available ( 0.00%)",13,10,"$"
  220.  
  221. CODE      ENDS
  222.  
  223.           END     START
  224.